import axios from 'axios'
import { Message } from 'element-ui'
// 引入store
import store from '@/store'
// 引入touter
import router from '@/router'
// 创建实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

// 定义一个校验token有效期函数 checkTimeOut
const checkTimeOut = () => {
  // 获取当前时间
  const currentTime = (new Date()).getTime()
  // 获取登录时储存的时间戳
  const loginTime = localStorage.getItem('hr_time_key')
  // 定义一个有效的token值时间
  const tokenDuration = 1000 * 60 * 60 * 2
  // const tokenDuration = 5000
  return (currentTime - loginTime) > tokenDuration
}

// 请求拦截器
service.interceptors.request.use(config => {
  const token = store.getters.token
  // 如果有token值，就给每个请求带上请求头
  if (token) {
    if (checkTimeOut()) {
      // token值失效：退出+报错
      // 退出：跳转到登录页,调用logout
      store.dispatch('user/logout')
      // 跳转
      router.push({ path: '/login' })
      // 报错
      return Promise.reject(new Error('token超时'))
    } else {
      // 请求头带上token
      config.headers.Authorization = 'Bearer ' + token
    }
  }
  return config
}, err => {
  Message.error(err.message)
  return Promise.reject(err)
})

// 响应拦截器
service.interceptors.response.use(
  res => {
    // 网络成功
    // 结构数据，data（token值）、success（成功与否布尔值），message
    const { data, success, message } = res.data
    // 如果成功，success为true
    if (success) {
      // 返回数据：token值
      // 提示信息
      // Message.success(message)
      return data
    } else {
      // 提示错误的信息，并拒绝发送请求
      Message.error(message)
      return Promise.reject(new Error(message))
    }
  }, err => {
    console.dir(err)
    // 当前token值失效的时候，会直接导致网络层面的出错
    // 与后端约定好的，如果code为10002，就代表是token失效，那么这时候，就需要退出并跳转到登录页
    // token的被动介入应该要写在响应拦截器里面
    if (err.response && err.response.data && err.response.data.code === 10002) {
      // 调用退出函数
      store.dispatch('user/logout')
      // 跳转到登录页
      router.push({ path: '/login' })
    }
    // 网路错误：拒绝发送请求，并返回错误信息
    Message.error(err.message)
    return Promise.reject(err)
  }
)

export default service
